package Fisica;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import Logica.Util;
import Modelo.Tarjeta;


public class DAOTarjeta {
	public static String SELECT = "select * from tarjeta";	
	public static String FIRST = "SELECT * FROM tarjeta order by nro_tarjeta_titular asc;";
	public static String LAST = "SELECT * FROM tarjeta order by nro_tarjeta_titular desc;";
	public static String PRE = "SELECT * FROM tarjeta WHERE nro_tarjeta_titular < ? order by nro_tarjeta_titular desc;";
	public static String POST = "SELECT * FROM tarjeta WHERE nro_tarjeta_titular > ? order by nro_tarjeta_titular asc;";
	public static String INSERT = "INSERT INTO tarjeta (padron_codigo, numero, extencion, foto, alta, id_categoria, id_relacion) VALUES (?,?,?,?,?,?,?);";
	public static String UPDATE = "UPDATE tarjeta SET extencion = ?, foto = ?, alta = ?, id_categoria = ?, id_relacion = ? WHERE id = ?;";
//	public static String UPDATE = "UPDATE tarjeta SET extencion = ?, foto = ?, alta = ?, id_categoria = ?, id_relacion = ? WHERE id = ?;";
	
	/**para abrir y guardar fotos...
	 * ver este link
	 * http://www.forosdelweb.com/f45/abrir-archivo-red-993610/
	 * manejo de archivos en red.
	 *  ////EQUIPO//ruta
	 * **/
	
	public static Modelo.Tarjeta get (int tarjeta){
		String sql = SELECT + " where id = ?;";
		try {
			PreparedStatement st = Conexion.getConexion().prepareStatement(sql);	
			st.setInt(1, tarjeta);
			ResultSet rs = st.executeQuery();			
			
			if (rs.next()){
				Modelo.Tarjeta a = new Modelo.Tarjeta(); 
				a.setId(rs.getInt("id"));
				a.setPadron_codigo(rs.getInt("padron_codigo")); 	
				a.setNumero(rs.getString("numero"));
				a.setExtencion(rs.getString("extencion"));
				a.setFoto(rs.getString("foto")); 	
				a.setAlta(Util.getDate(rs.getString("alta")));
				a.setIdCategoria(rs.getInt("id_categoria"));
				a.setIdRelacion(rs.getInt("id_relacion"));
				
				return a;
			}			
		} catch (SQLException e) {
			System.out.print("ERROR EN LA RECUPERACION DE DATOS DE LA BASE");
			e.printStackTrace();
		} 				
		return new Tarjeta();
	}
	
//	public static String getNombre (int tarjeta){
//		String nombre = "";
//		String sql1 = SELECT + " where id = ? and extencion = 0;";
//		String sql2 = SELECT + " where id = ? and extencion > 0;";
//		
//		String padron = "select * from ctacte_padron where padron_codigo = ?;";
//		String extencion = "select * from tarjeta_extencion where id_tarjeta = ?;";
//		try {
//			PreparedStatement st = Conexion.getConexion().prepareStatement(sql1);
////			PreparedStatement st2 = Conexion.getConexion().prepareStatement(sql1);
//			st.setInt(1, tarjeta);
//			ResultSet rs = st.executeQuery();			
//			
//			List<Object> list = new ArrayList();
//			while (rs.next()){
//				Modelo.Tarjeta a = new Modelo.Tarjeta(); 
//				a.setId(rs.getInt("id"));
//				a.setPadron_codigo(rs.getInt("padron_codigo")); 	
//				a.setNumero(rs.getString("numero"));
//				a.setExtencion(rs.getString("extencion"));
//				a.setFoto(rs.getString("foto")); 	
//				a.setAlta(Util.getDate(rs.getString("alta")));
//				a.setIdCategoria(rs.getInt("id_categoria"));
//				a.setIdRelacion(rs.getInt("id_relacion"));
//				
//				list.add(a);
//			}
//			if(list.size() == 1){
//				 st = Conexion.getConexion().prepareStatement(padron);
//				 st.setInt(1, ((Tarjeta)list.get(0)).getPadron_codigo());
//				 rs = st.executeQuery();
//				 
//				 if (rs.next()){
//					 nombre = rs.getString("padron_apelli")+", "+rs.getString("padron_nombre");
//					 return nombre;
//				 }				
//			}				
//			else{
//				st = Conexion.getConexion().prepareStatement(sql2);
//				st.setInt(1, tarjeta);
//				rs = st.executeQuery();
//				 
//				 if (rs.next()){
//					 st = Conexion.getConexion().prepareStatement(extencion);
//					 st.setInt(1, tarjeta);					
//					 rs = st.executeQuery();
//					 
//					 nombre = rs.getString("apellido")+", "+rs.getString("nombre");
//					 return nombre;
//				 }	
//			}			
//		} catch (SQLException e) {
//			System.out.print("ERROR EN LA RECUPERACION DE DATOS DE LA BASE");
//			e.printStackTrace();
//		} 				
//		return "";
//	}
	
//	select * from tarjeta;
	public static List<Object> getList (){
		List<Object> list = new ArrayList();
		String sql = SELECT +";";;
		try {
			PreparedStatement st = Conexion.getConexion().prepareStatement(sql);	
			ResultSet rs = st.executeQuery();			
			Tarjeta a;
			while (rs.next()){				
				a = new Modelo.Tarjeta(); 
				a.setId(rs.getInt("id"));
				a.setPadron_codigo(rs.getInt("padron_codigo")); 	
				a.setNumero(rs.getString("numero"));
				a.setExtencion(rs.getString("extencion"));
				a.setFoto(rs.getString("foto")); 	
				a.setAlta(Util.getDate(rs.getString("alta")));
				a.setIdCategoria(rs.getInt("id_categoria"));
				a.setIdRelacion(rs.getInt("id_relacion"));
				
				list.add(a);
			}			
		} catch (SQLException e) {
			System.out.print("ERROR EN LA RECUPERACION DE DATOS DE LA BASE");
			e.printStackTrace();
		} 				
		return list;
	}
	
	
	 public boolean insert(Object obj) { //ok
		Tarjeta v = (Tarjeta)obj;
		
//INSERT INTO tarjeta (padron_codigo, numero, extencion, foto, alta, id_categoria, id_relacion) 
//VALUES (1234, '4321','N','\\\\luciano-pc\imagenes\lu.jpg','2015/07/30', 1,1);
		/** para insertar una ruta de red, debo comenzar con doble caracter scope. */
		try {			
			PreparedStatement st;
			ResultSet rs;
			//INSERTO
			st = Conexion.getConexion().prepareStatement(INSERT);	
			st.setInt(1, v.getPadron_codigo());
			st.setString(2, v.getNumero());
			st.setString(3, v.getExtencion());
			st.setString(4, v.getFoto());
			st.setString(5, Util.getDate(v.getAlta()));
			st.setInt(6, v.getIdCategoria());
			st.setInt(7, v.getIdRelacion());
						
			st.executeUpdate();
			//RECUPERO
			st = Conexion.getConexion().prepareStatement(SELECT+" where numero = ? and padron_codigo = ?;");
			st.setString(1, v.getNumero());
			st.setInt(2, v.getPadron_codigo());
			rs = st.executeQuery();
			if(rs.next())
				v.setId(rs.getInt("id"));
			System.out.println("inserto: "+v.getId());

			return true;
			
		}catch(Exception e){
			System.out.println("exception al intentar insertar: "+v.getId());
			e.printStackTrace();
		}
		return false;
			
	}
	
	public boolean update(Object obj){ //ok
		Tarjeta v = (Tarjeta)obj;
//		"UPDATE tarjeta SET extencion = ?, foto = ?, alta = ?, id_categoria = ?, id_relacion = ? WHERE `id` = ?;";
//		String upd = "UPDATE tarjeta SET extencion = ?, foto = ?, alta = ?, id_categoria = ?, id_relacion = ? WHERE id = ?;";
		try {			
			PreparedStatement st;		
			ResultSet rs;
			//INSERTO
			st = Conexion.getConexion().prepareStatement(UPDATE);
			st.setString(1, v.getExtencion());
			st.setString(2, v.getFoto());
			st.setString(3, Util.getDate(v.getAlta()));
			st.setInt(4, v.getIdCategoria());
			st.setInt(5, v.getIdRelacion());
			st.setInt(6, v.getId());
			
			st.executeUpdate();
			//RECUPERO
			st = Conexion.getConexion().prepareStatement(SELECT+" where numero = ? and padron_codigo = ?;");
			st.setString(1, v.getNumero());
			st.setInt(2, v.getPadron_codigo());
			rs = st.executeQuery();
			if(rs.next())
				v.setId(rs.getInt("id"));
			System.out.println("actualizo: "+v.getId());

			return true;
			
		}catch(Exception e){
			System.out.println("exception al actualizar insertar: "+v.getId());
			e.printStackTrace();
		}
		return false;
			
	}
	
	
	public boolean delete(Object obj){ //ok
		Tarjeta v = (Tarjeta)obj;
		String delete = "delete from tarjeta where nro_tarjeta_titular = ?;";
		String select = SELECT +" where nro_tarjeta_titular = ?;";
		try {			
			PreparedStatement st;
			ResultSet rs;
			st = Conexion.getConexion().prepareStatement(delete);	
			st.setInt(1, v.getId());
			st.executeUpdate();
			
			st = Conexion.getConexion().prepareStatement(select);	
			st.setInt(1, v.getId());
			rs = st.executeQuery();
			
			System.out.println("inserto: "+v.getId());

			return !rs.next();
			
		}catch(Exception e){
			System.out.println("exception al intentar insertar: "+v.getId());
			e.printStackTrace();
		}
		return false;
	}
	

	public static void main(String[] args) {
		DAOTarjeta p = new DAOTarjeta();
//		p.getArticulo();
		
		Tarjeta t = new Tarjeta();
//		t.setPadron_codigo(9999);
//		t.setNumero("99999999");
//		t.setExtencion("0");
//		t.setFoto("\\\\192.168.1.4\\carpeta con espacios\\archivo con espacios.pdf");  //lo ingresa correctamente.
//		t.setAlta(new Date());
//		t.setIdCategoria(9);
//		t.setIdRelacion(9);
		
//		p.insert(t);
		
		t = p.get(2);
		t.setFoto("\\\\pc-luis\\carpeta\\foto nueva.jpg");
		t.setExtencion("2");
		p.update(t);
		

	}
	
	public Object getObject (PreparedStatement st){ //ok
		Tarjeta a = new Tarjeta(); 	
		
		try {
//			PreparedStatement st = Conexion.getConexion().prepareStatement(sql);	
			ResultSet rs = st.executeQuery();			
			FileOutputStream archivofoto;
			File file; 
			if (rs.next()){
				a.setId(rs.getInt("id"));
				a.setPadron_codigo(rs.getInt("padron_codigo")); 	
				a.setNumero(rs.getString("numero"));
				a.setExtencion(rs.getString("extencion"));
				a.setFoto(rs.getString("foto")); 	
				a.setAlta(Util.getDate(rs.getString("alta")));
				a.setIdCategoria(rs.getInt("id_categoria"));
				a.setIdRelacion(rs.getInt("id_relacion"));
				
//				file = new File(a.getFoto());
//				archivofoto = new FileOutputStream(file);      
//				archivofoto = new FileOutputStream(o.getUrlImg());
//				Blob bin = rs.getBlob("pesoImg");
//				InputStream inStream = bin.getBinaryStream();
//                int size = (int)bin.length();
//                byte[] buffer = new byte[size];
//                int length = -1;
//                while ((length = inStream.read(buffer)) != -1)
//                {
//                	archivofoto.write(buffer, 0, length);                
//                } 
//                
//				o.setImg( (FileInputStream) inStream);
			}	
			return a;
		} catch (SQLException e) {
			System.out.print("ERROR EN LA RECUPERACION DE DATOS DE LA BASE");
			e.printStackTrace();
		} 		
		return new Tarjeta();		
	}

	public Object getPre(int id) {
		try {
			PreparedStatement st = Conexion.getConexion().prepareStatement(PRE);
			st.setInt(1, id);
			return getObject(st);
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		
		return null;
	}

	public Object getPost(int id) {
		try {
			PreparedStatement st = Conexion.getConexion().prepareStatement(POST);
			st.setInt(1, id);
			return getObject(st);
		} catch (SQLException e) {			
			e.printStackTrace();
		}		
		return null;
	}
	
	public Object getFirst() {
		try {
			PreparedStatement st = Conexion.getConexion().prepareStatement(FIRST);
			return getObject(st);
		} catch (SQLException e) {			
			e.printStackTrace();
		}		
		return null;
	}
	
	public Object getLast() {
		try {
			PreparedStatement st = Conexion.getConexion().prepareStatement(LAST);
			return getObject(st);			
		} catch (SQLException e) {			
			e.printStackTrace();
		}		
		return null;
	}

}
